package cool.taomu.toolkit.hikaricp.provider

import com.google.inject.Provider
import com.zaxxer.hikari.HikariConfig
import com.zaxxer.hikari.HikariDataSource
import cool.taomu.toolkit.entity.DataSourceConfigEntity
import java.util.Properties
import javax.sql.DataSource
import org.slf4j.LoggerFactory

class HikariProvider implements Provider<DataSource> {
    val static LOG = LoggerFactory.getLogger(HikariProvider)

    DataSourceConfigEntity config

    new(DataSourceConfigEntity config) {
        this.config = config
    }

    private def HikariDataSource toHikariDataSource(DataSourceConfigEntity config) {
        var hikariConfig = new HikariConfig();

        // 基础信息
        hikariConfig.setDriverClassName(config.getDriverClassName());
        hikariConfig.setJdbcUrl(config.getUrl());
        hikariConfig.setUsername(config.getUsername());
        hikariConfig.setPassword(config.getPassword());

        // 自动提交设置
        var Boolean defaultAutoCommit = config.getDefaultAutoCommit();
        hikariConfig.setAutoCommit(defaultAutoCommit !== null ? defaultAutoCommit : true);

        // 连接池大小相关
        hikariConfig.setMaximumPoolSize(config.getMaxActive());
        hikariConfig.setMinimumIdle(config.getMinIdle());
        hikariConfig.setInitializationFailTimeout(1); // 不要阻塞启动
        // 连接超时时间
        hikariConfig.setConnectionTimeout(config.getMaxWait());

        // 初始化SQL脚本
        if (config.getConnectionInitSqls() !== null && !config.getConnectionInitSqls().isEmpty()) {
            hikariConfig.setConnectionInitSql(config.getConnectionInitSqls().get(0)); // 只支持一条
        }

        // 健康检查
        if (config.getValidationQuery() !== null) {
            hikariConfig.setConnectionTestQuery(config.getValidationQuery());
        } else {
            hikariConfig.setConnectionTestQuery("SELECT 1");
        }

        // 测试策略（只能在空闲时测试）
        hikariConfig.setIdleTimeout(config.getValidationInterval());

        // SSL 配置
        if (config.isSslEnabled()) {
            var Properties props = new Properties();
            if (config.getSslTrustStorePath() !== null) {
                props.setProperty("javax.net.ssl.trustStore", config.getSslTrustStorePath());
            }
            if (config.getSslTrustStorePassword() !== null) {
                props.setProperty("javax.net.ssl.trustStorePassword", config.getSslTrustStorePassword());
            }
            hikariConfig.setDataSourceProperties(props);
        }

        // Hikari 不支持“废弃连接回收”，但可以设置最大生命周期
        if (config.isRemoveAbandoned()) {
            hikariConfig.setMaxLifetime(config.getAbandonedTimeout());
        }

        // JMX 支持（默认开启）
        hikariConfig.setRegisterMbeans(config.isEnableJmx());

        // Hikari 不支持 filters，但可启用 leak detection
        hikariConfig.setLeakDetectionThreshold(60_000); // 默认检测泄漏时间
        return new HikariDataSource(hikariConfig);
    }

    override get() {
        if (config === null) {
            LOG.warn("DataSourceConfigEntity 配置类为空");
            return null;
        }

        return toHikariDataSource(config);
    }

}
